home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et3_0-a1.lha / et3 / src / PROGENV / ObjectView.C < prev    next >
C/C++ Source or Header  |  1992-05-21  |  5KB  |  218 lines

  1. #ifdef __GNUG__
  2. #pragma implementation
  3. #endif
  4.  
  5. #include "ObjectView.h"
  6.  
  7. #include "ET++.h"
  8.  
  9. #include "ObjArray.h"
  10. #include "ObjList.h"
  11. #include "AccessMem.h"
  12. #include "Exception.h"
  13. #include "Math.h"
  14.  
  15. #include "EtPeManager.h"
  16. #include "EtPeCmdNo.h"
  17. #include "ProgEnv.h"
  18. #include "InspItem.h"
  19. #include "Reference.h"
  20.  
  21. const int cMaxItems = 256;
  22.  
  23. //---- PeShowMembers -------------------------------------------------------------
  24.  
  25. class PeShowMembers: public AccessMembers {
  26.     int supercnt;
  27.     PeObjectView *dv;
  28.     Object *op;
  29. public:
  30.     void Reset(Object *op, PeObjectView *v);
  31.     void ClassName(char *name);
  32.     void Member(char *name, int offset, int offsetOrLen, int type, Class *cl,
  33.                         bool global, bool lenglobal)
  34.     { dv->AddItem(new PeInspectorItem(name,
  35.         new Ref(op, type, offset, offsetOrLen, cl, global, lenglobal))); }
  36. };
  37.  
  38. void PeShowMembers::Reset(Object *o, PeObjectView *v)
  39. {
  40.     supercnt= 0;
  41.     dv= v;
  42.     op= o;
  43. }
  44.  
  45. void PeShowMembers::ClassName(char *name)
  46. {
  47.     if (supercnt == 0)
  48.     dv->AddItem(new PeClassItem0(op, name));
  49.     else
  50.     dv->AddItem(new PeSuperItem0(name));
  51.     supercnt++;
  52. }
  53.  
  54. //---- PeObjectView ---------------------------------------------------------------
  55.  
  56. NewMetaImpl0(PeObjectView, CollectionView);
  57.  
  58. PeShowMembers *PeObjectView::accessor;
  59. int PeObjectView::accessorcnt;
  60.     
  61. PeObjectView::PeObjectView() : CollectionView(0, new ObjList, eCVDefault)
  62. {
  63.     inspected= 0;
  64.     if (accessor == 0) {
  65.     accessorcnt= 0;
  66.     accessor= new PeShowMembers;
  67.     }
  68.     accessorcnt++;
  69. }
  70.  
  71. PeObjectView::~PeObjectView()
  72. {
  73.     if (--accessorcnt <= 0)
  74.     SafeDelete(accessor);
  75.     if (inspected && inspected->IsObject()) 
  76.     inspected->GetObject()->RemoveObserver(this);
  77. }
  78.  
  79. void PeObjectView::SetInspected(Ref *newinsp)
  80. {
  81.     Ref *oldref= inspected;
  82.     if (inspected && inspected->IsObject()) 
  83.     inspected->GetObject()->RemoveObserver(this);
  84.  
  85.     inspected= newinsp;
  86.     if (inspected) {
  87.     Build();
  88.     if (inspected->IsObject())
  89.         inspected->GetObject()->AddObserver(this);
  90.     }
  91.     UpdateViews();      // always update values
  92. }
  93.   
  94. void PeObjectView::DoObserve(int, int part, void*, Object *op)
  95. {
  96.     if (op && inspected && (op == inspected->GetBase())
  97.                         && part != cPartSenderDied) 
  98.     UpdateViews();
  99. }
  100.  
  101. void PeObjectView::InspectedDied()
  102. {
  103.     SetInspected(0);
  104.     // ??? what if an InspectorItem died ???
  105.  
  106.     TRY {
  107.     Collection *cp= GetCollection();
  108.     cp->ForEach(PeInspectorItem0,Died)();
  109.     } CATCH(ex) {
  110.     return;
  111.     } ENDTRY
  112.     
  113.     ForceRedraw();
  114. }
  115.  
  116. void PeObjectView::DoSelect(Rectangle r, int)
  117. {
  118.     PeInspectorItem0 *di= (PeInspectorItem*) GetCollection()->At(r.origin.y);
  119.     if (di && inspected) 
  120.     di->Deref(shifted);
  121. }
  122.  
  123. Command *PeObjectView::DispatchEvents(Point p, Token &t, Clipper *cl)
  124. {
  125.     if (inspected)
  126.     return CollectionView::DispatchEvents(p, t, cl);
  127.     return gNoChanges;
  128. }
  129.  
  130. Command *PeObjectView::DoLeftButtonDownCommand(Point p, Token t, int cl)
  131. {
  132.     shifted= t.Flags == eFlgShiftKey;
  133.     return CollectionView::DoLeftButtonDownCommand(p, t, cl);  
  134. }
  135.  
  136. void PeObjectView::AddItem(PeInspectorItem0 *ii)
  137. {
  138.     GetCollection()->Add(ii);
  139. }
  140.  
  141. void PeObjectView::Build()
  142. {
  143.     GetCollection()->FreeAll();
  144.     if (inspected) {
  145.     if (inspected->GetLen() >= 0)
  146.         BuildArrayView();
  147.     else if (inspected->IsObject()) 
  148.         BuildInstanceView();    
  149.     else 
  150.         AddItem(new PeInspectorItem("simple", new Ref(*inspected)));
  151.     }
  152. }
  153.  
  154. void PeObjectView::BuildInstanceView()
  155. {
  156.     if (inspected->IsObject()) {
  157.     accessor->Reset(inspected->GetObject(), this);
  158.     inspected->GetObject()->IsA()->EnumerateMembers(accessor);
  159.     }
  160. }
  161.  
  162. void PeObjectView::BuildArrayView()
  163. {
  164.     register int i, off;
  165.     int l= Math::Min(cMaxItems, inspected->GetLen());
  166.     int size= inspected->Size();
  167.  
  168.     for (i= off= 0; i < l; i++, off+= size)
  169.     AddItem(new PeInspectorItem(form("[%d]", i), 
  170.         new Ref(inspected->GetBase(), inspected->GetType(), off, 0,
  171.                     inspected->GetClass())));
  172. }
  173.  
  174. void PeObjectView::UpdateViews()
  175. {
  176.     TRY {
  177.     GetCollection()->ForEach(PeInspectorItem0,Update)();
  178.     } CATCH(ex) {
  179.     return;
  180.     } ENDTRY
  181.     
  182.     SetSelection(gRect0);
  183.     Modified();
  184. }
  185.  
  186. void PeObjectView::DoSetupMenu(Menu *menu)
  187. {
  188.     if (inspected) {
  189.     char *viewname= gProgEnv->HasObjectView(inspected->GetClass(), 
  190.                           inspected->GetBase(),
  191.                           inspected->GetObject());
  192.     if (viewname) {
  193.         menu->ReplaceItem(cABSTRVIEW, viewname);
  194.         menu->EnableItem(cABSTRVIEW);
  195.     }
  196.     if (inspected->IsObject()) 
  197.         menu->EnableItems(cOBJREFERENCES, cOBJBROWSER, cEDITDECL, cEDITIMPL, 0);
  198.     }
  199.     menu->EnableItems(cPRINT, cSPAWN, 0);
  200.     CollectionView::DoSetupMenu(menu);
  201. }
  202.  
  203. Command *PeObjectView::DoMenuCommand(int cmd)
  204. {
  205.     if (cmd == cABSTRVIEW)
  206.     gProgEnv->ShowObjectView(inspected->GetClass(), inspected->GetBase(), 
  207.                    inspected->GetObject(), this);
  208.     else
  209.     return View::DoMenuCommand(cmd);
  210.     return gNoChanges;
  211. }
  212.  
  213. bool PeObjectView::PrintOnWhenObserving(Object *)
  214. {
  215.     return FALSE;
  216. }
  217.  
  218.